package com.cnaaa.pay.service;

import com.alipay.api.AlipayApiException;
import com.cnaaa.pay.entity.Trade;
import com.cnaaa.pay.vo.alipay.AlipayReturnVo;
import com.cnaaa.pay.vo.CreateTradeVo;
import com.cnaaa.pay.vo.TradeStatusVo;
import com.cnaaa.pay.vo.alipay.TradeVo;

import java.util.List;
import java.util.Map;

/**
 * 2018/10/29 Create by 郭文梁
 * TradeService
 * 交易业务逻辑定义
 *
 * @author 郭文梁
 * @date 2018/10/29
 */
public interface TradeService extends StringIdService<Trade> {
    /**
     * 创建交易
     * <p>
     * 调用示例
     * </p>
     * <pre>
     *     <code>
     * CreateTradeVo tradeVo = new CreateTradeVo();
     * tradeVo.setAmount("10010");//设置交易金额
     * tradeVo.setName("VPS 1年");//设置交易/商品名称
     * tradeVo.setDescription("交易描述");//设置交易描述
     * tradeVo.setReturnUrl("http://domain/pay-success.html");//设置交易成功供跳转到的页面
     * tradeVo.setProductId(10L);//设置商品ID
     * tradeVo.setUsername("用户名");//设置交易的用户名
     * tradeVo.setUserId(100152);//设置交易用户ID
     * .............设置其他参数
     *
     * TradeVo trade = tradeService.create(tradeVo);//创建交易
     * String tradeId = trade.getTradeId(); //获取交易ID
     * //接下来只需要让前端页面跳转到 http://domain/trade-page/pay/{tradeId}处即可
     * //页面会自动重定向到支付宝或微信支付界面
     * //创建交易后该交易处于创建状态，未与支付平台发生任何关联，只有当上诉地址打开并且用户选择交易方式后交易才处于活动状态
     *     </code>
     * </pre>
     *
     * @param createTradeVo 交易参数
     * @return 交易内容
     */
    TradeVo create(CreateTradeVo createTradeVo);

    /**
     * 检查交易是否存在
     *
     * @param id      Id
     * @param tradeNo 交易号
     * @return 交易
     */
    boolean checkTradeAndIdNotExists(String id, String tradeNo);

    /**
     * 处理支付宝支付返回
     *
     * @param returnVo 返回内容
     * @return 交易
     */
    Trade onPayReturn(AlipayReturnVo returnVo);

    /**
     * 关闭所有超时的支付宝交易
     *
     * @return 关闭了多少条交易
     * @throws AlipayApiException API异常
     */
    int closeTimeoutAlipayTrade() throws AlipayApiException;

    /**
     * 处理支付宝通知
     *
     * @param params 支付宝所有参数
     * @return 是否成功
     */
    boolean onAlipayNotify(Map<String, String> params);

    /**
     * 根据交易号搜索
     *
     * @param tradeNo 交易号
     * @return 交易列表
     */
    Trade searchByTradeNo(String tradeNo);

    /**
     * 查看交易状态
     *
     * @param tradeId 交易ID
     * @return 交易状态
     */
    TradeStatusVo status(String tradeId);

    /**
     * 查找指定用户的交易记录
     *
     * @param userId 用户ID
     * @param page   页数
     * @param size   每页大小
     * @return 交易记录
     */
    List<Trade> listByUser(long userId, int page, int size);

    /**
     * 获取某用户的交易数量
     *
     * @param userId 用户ID
     * @return 交易数量
     */
    int getUserTradeCount(long userId);

}
